function deepClone1(target) {
    //通过数据创建JSON格式的字符串
    let str = JSON.stringify(target)
    let data = JSON.parse(str)
    return data
}

function deepClone2(target) {
    //监测数据的类型
    if (typeof target === 'object' && target != null) {
        const result = Array.isArray(target) ? [] : {}
        for (let key in obj) {
            //监测该属性是否为对象本身的属性(不能拷贝原型对象的属性)
            if (target.hasOwnProperty(key)) {
                result[key] = deepClone2(target[key])
            }
        }
        return result
    }
    else {
        return target
    }
}

function deepClone3(target, map = new Map()) {
    if (typeof target === 'object' && target != null) {
        //克隆数据之前，进行判断，数据之前是否克隆过
        let cache = map.get(target)
        if (cache) {
            return cache
        }
        //创建一个容器
        const result = Array.isArray(target) ? [] : {};
        //将新的结果存入到容器中
        map.set(target, result);
        //遍历对象
        for (let key in target) {
            //检测该属性是否为对象本身的属性(不能拷贝原型对象的属性)
            if (target.hasOwnProperty(key)) {
                result[key] = deepClone3(target[key], map);
            }
        }
        return result
    }
    else {
        return result
    }
}

function deepClone4(target, map = new Map()) {
    if (typeof target === 'object' && target != null) {
        //克隆数据之前，进行判断，数据之前是否克隆过
        let cache = map.get(target)
        if (cache) {
            return cache
        }
        //创建一个容器
        const result = Array.isArray(target) ? [] : {};
        //将新的结果存入到容器中
        map.set(target, result);
        //如果是数组
        if (Array.isArray(target)) {
            target.forEach((item, index) => {
                result[index] = deepClone4(item, map)
            })
        }
        else
        {
            //如果是对象，获取所有的键名，然后forEach遍历
            Object.keys(target).forEach(key=>{
                result[key]=deepClone(target[key],map)
            })
        }
        return result
    }
    else {
        return result
    }
}